
package oreilly.command.control;

/**
 * 模擬遠端控制器, 我們可以假想這是一台控制器, 控制器上有按鈕,<br>
 * 左右兩邊各有七個按鈕, 左邊為執行鈕, 右邊為取消鈕<br>
 * <br>
 * Copyright: Copyright (c) 2002-2007<br>
 * Company: E885 有限公司
 * 
 * @author Eric Gau(gau168.gau@msa.hinet.net)
 * @version 1.0
 */
public class RemoteControl
{
	/**
	 * 模擬擴充槽左右兩邊各有七個按鈕
	 */
	int slotSize = 7;

	/**
	 * 執行按鈕
	 */
	Command onCommands[] = new Command[ slotSize ];

	/**
	 * 取消按鈕
	 */
	Command offCommands[] = new Command[ slotSize ];

	/**
	 * 模擬出廠時, 控制器的按鈕都沒有被設定, 完全沒有功能
	 * 
	 */
	public RemoteControl()
	{
		for( int i = 0; i < slotSize; i++ )
		{
			onCommands[ i ] = new NoCommand();
			offCommands[ i ] = new NoCommand();
		}
	}

	/**
	 * 按下取消按鈕
	 * 
	 * @param slot 取消指定功能按鈕
	 */
	public void pressOffButton( int slot )
	{
		offCommands[ slot ].execute();
	}

	/**
	 * 按下執行按鈕
	 * 
	 * @param slot 執行指定功能的按鈕
	 */
	public void pressOnButton( int slot )
	{
		onCommands[ slot ].execute();
	}

	/**
	 * 模擬設定控制器
	 * 
	 * @param slot 要設定在哪一槽
	 * @param onCommand 設定執行功能
	 * @param offCommand 設定取消功能
	 */
	public void setCommand( int slot, Command onCommand, Command offCommand )
	{
		if( onCommand != null )
		{
			onCommands[ slot ] = onCommand;
		}

		if( offCommand != null )
		{
			offCommands[ slot ] = offCommand;
		}
	}

	/**
	 * 印出控制器所有的功能
	 */
	@Override
	public String toString()
	{
		StringBuffer buffer = new StringBuffer();

		buffer.append( "============= Remote Control ===============\n" );

		for( int i = 0; i < slotSize; i++ )
		{
			buffer.append( "Slot[" + i + "]:" + onCommands[ i ].getClass().getName() + "\n" );
			buffer.append( "Slot[" + i + "]:" + offCommands[ i ].getClass().getName() + "\n" );
		}

		return buffer.toString();
	}
}
